/**
 *@typedef Prato_t
 *@brief Elemento manipulado pelo módulo de pilhas
 *
 *@details O módulo de pilhas criado para o jogo
 * trabalha com pilhas de elementos do tipo Prato_t.
 * Se for necessário mudar o tipo de elemento que o
 * módulo de pilhas deverá utilizar é só modificar
 * esse typedef.
 *
 */
typedef int Prato_t;

/**
 *@typedef Pilha_id
 *@brief O tipo usado para criar uma pilha
 *
 *@details Variáveis do tipo Pilha_id armazenam
 * um inteiro que que representa a pilha a ser
 * manipulada. Toda pilha tem um número positivo
 * inteiro que a identifica.
 *\n
 * O motivo de Pilha_id poder armazenar números
 * negativos quando na verdade as pilhas só
 * são representadas por números positivos é
 * que a variável do tipo Pilha_id pode não
 * estar apontando para uma pilha e, nesse caso,
 * ela guarda um valor negativo.
 *\n
 * Exemplo de código
 *@code
 * Pilha_id minha_pilha = nova_pilha();
 * if(minha_pilha < 0){
 *  printf("Pilha não podê ser criada\n");
 * }
 * @endcode
 *
 *@see nova_pilha
 *
 */
typedef short int Pilha_id;

/**
 *@typedef Bool_t
 *@brief tipo bool
 *
 *@details O projeto é todo escrito em C, mas
 * C não tem o tipo bool, então o Bool_t deve
 * ser uma variável que ocupe o menor espaço
 * possível na RAM e possa armazenar pelo menos
 * 1 (usado como verdadeiro) e 0 (falso).
 *
 */
#ifdef __bool_true_false_are_defined
 typedef bool Bool_t;
#else
 typedef uint8_t Bool_t;
#endif

/**
 *@typedef Tamanho_t
 *@brief Armazena o tamanho de uma pilha
 *
 *@details Cada pilha tem um tamanho não-fixo e o
 * tamanho das pilhas armazenados no módulo de
 * pilhas são variáveis do tipo Tamanho_t. Não é
 * necessário declarar variáveis do tipo Tamanho_t
 * fora do módulo de pilhas, pois elas só são usadas
 * internamente no módulo de pilhas.
 *\n
 * Se quiser armazenar o tamanho de uma pilha fora
 * do módulo de pilhas use o tipo STamanho_t.
 *
 *@see STamanho_t
 *
 */
typedef unsigned int Tamanho_t;

/**
 *@typedef STamanho_t
 *@brief Armazena o tamanho de uma pilha
 *
 *@details STamanho_t tem as mesmas características
 * de Tamanho_t, porém ela é útil mesmo fora do
 * módulo de pilhas. Quando a pilha existe e não
 * está vazia, a variável do tipo STamanho_t
 * armazena um número natural não-nulo, quando a
 * pilhas existe e está vazia ela armazena 0 e
 * quando a pilha não existe ela armazena um número
 * negativo.
 *\n
 *@code
 * STamanho_t tam_pilha = ver_tam_pilha(minha_pilha);
 * if(tam_pilha > 0){
 *  printf("Pilha existe e armazena elementos\n");
 * }else if(tam_pilha == 0){
 *  printf("Pilha existe e está vazia\n");
 * }else if(tam_pilha < 0){
 *  printf("Pilha não existe\n");
 * }
 * @endcode
 *\n
 * STamanho_t deve ser de um tipo que possa armazenar
 * todos os valores que Tamanho_t pode conter e ainda
 * poder armazenar pelo menos um valor negativo.
 *
 *@see Tamanho_t ver_tam_pilha
 *
 */
typedef long int STamanho_t;

#ifndef TRUE
# define TRUE 1
#endif
#ifndef FALSE
# define FALSE 0
#endif
#if TRUE != 1
# undef TRUE
# define TRUE 1
#endif
#if FALSE != 0
# undef FALSE
# define FALSE 0
#endif

unsigned short int ver_num_pilhas( void );
Pilha_id nova_pilha( void );
Bool_t existe_pilha(Pilha_id pilha);
Bool_t esta_vazia(Pilha_id pilha);
STamanho_t ver_tam_pilha(Pilha_id pilha);
Bool_t colocar_na_pilha(Pilha_id pilha,Prato_t elemento);
Prato_t tirar_da_pilha(Pilha_id pilha);
Prato_t ver_na_pilha(Pilha_id pilha);
Bool_t destruir_pilha(Pilha_id pilha);
Bool_t destruir_pilhas( void );
